<?php
use com\soka as soka;
use com\lib as lb;
class Nomina_Ctl extends soka\SokaController
{
	private $_nom, $_pago, $_proyecto, 
	$_cal, $_con, $NominaObj, $_emp, $_par, $_rep, $_report_html_name;	

	public function _init()
	{
		$this->_nom  = 	$this->setModel('nomina');
		$this->_pago =  $this->setModel('pago');
		$this->_proyecto = $this->setModel('proyecto');
		$this->_cal = $this->setModel('calendario');
		$this->_con = $this->setModel('concepto');
		$this->_par = $this->setModel('parafiscal');
	}

	public function viewReportToMysql($nomina= null)
	{
		$this->view(false);
		$nomina = is_null($nomina) ? NULL : $nomina;
		$this->_nom->id($nomina)->getById();
		header("Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
		header('Content-Disposition: attachment;filename="nomina.xlsx"');
		header('Cache-Control: max-age=0');
		print $this->_nom->archivo();
	}

	private function _saveReportToMysql($path= null, $id_nomina = null)
	{
		$this->view(false);
		if(file_exists($path)) {	
			$fp = fopen($path, "rb");
			$contenido = fread($fp, filesize($path));
			$contenido = addslashes($contenido);
			fclose($fp); 
		}
		# guardo la nomina generada
		$this->_nom->uploadReport($id_nomina, $contenido);
	}

	private function makeExcelNominaNew($proyecto = NULL, $nom = NULL) 
	{
		$this->setLib('PHPExcel/IOFactory');

		$tpl_nom = ($proyecto != 3) ? TPL_NOM : TPL_NOM_ADM;

		$objPHPExcel = PHPExcel_IOFactory::load($tpl_nom);
		$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');

		$row = 4; // actual row

		$this->_proyecto->id($proyecto)->getById();

		$this->_rep = new lb\Report($objPHPExcel, $this->_con);

		$this->_rep->BuildInfo()->buildHeader($this->_proyecto->nombre());

		$this->_nom->id($nom)->getById();
		self::liquidarNomina( $this->_nom->getEmpleadoProyecto($proyecto), 
							  $this->_nom->fecha_inicio(),
							  $this->_nom->fecha_fin());

		$dias = 14;
		foreach ( $this->NominaObj as $emp ) {
			$objPHPExcel->setActiveSheetIndex(0);
			$this->_rep->setVal('A',$row, $emp->informacion->primer_nombre.' '. $emp->informacion->primer_apellido)
				->setVal('B', $row, 'Obrero') //$emp->informacion->cargo
				->setVal('D', $row, $dias--)
				->setVal('C', $row, $emp->devengado->sueldo)
				->setVal('G', $row, $emp->devengado->auxilio)
				->setVal('E', $row, $emp->devengado->hextras)
				->setVal('F', $row, $emp->devengado->comision);
			$row++;
		}    

		//$name = lb\Report::makeName($this->_proyecto->nombre(), $this->_nom->fecha_inicio(), $this->_nom->fecha_fin());
		$name = 'report/'.$this->_proyecto->nombre().'-'. $this->_nom->id().'.xlsx';
		$objWriter->save($name);
		# guardo la nomina generada
		$this->_saveReportToMysql($name, $nom);
	}

	public function ver()
	{	
		$nomina_id = isset($_POST['id_pago']) ? (int) $_POST['id_pago'] : null; 
 		$pago_nomi = $this->_nom->getNominaPago($nomina_id);
		$this->data = array('info_nomina'=>$this->_nom->getNominaEmpleado($pago_nomi[0]->fecha, $pago_nomi[0]->nomina_id), 'proyecto'=>$pago_nomi[0]->nombre, 'fecha_inicio'=>$pago_nomi[0]->fecha_inicio, 'fecha_fin'=>$pago_nomi[0]->fecha_fin,
			'parafiscal'=>$this->_nom->viewparafiscales($pago_nomi[0]->nomina_id));
		soka\View::show('nomina/ver', false, true);
	}

	public function getCalendar() 
	{
		$this->view(false);
 		$termino = isset($_GET['term']) ? $_GET['term'] : null;
		echo json_encode($this->_cal->get($termino));
	}

	public function getEmpleado()
 	{
 		$this->view(false);
 		$termino = isset($_GET['term']) ? $_GET['term'] : null;
		echo json_encode($this->_empl->get($termino));
	}

	public function index($id = null)
	{
		soka\View::setJs(array('nomina'));
		$this->combo = $this->_proyecto->showlist('nombre');
		isset($_POST['id']) ? self::_update(): false;				
		$this->datos = isset($_POST['btn_buscar']) ? $this->_nom->getAll(null, null, array('nombre'=> $_POST['txt_buscar'])):  $this->_nom->getAll();
		$this->datos = $this->_nom->get();
	}

	public function add()
	{
		$this->view(false);
		$f = new com\lib\Form();
		$response = array();
		if ( $f->tipo_empleado && $f->tipo_empleado != 0 ) {
			switch ($f->tipo_empleado) {
				case 1:
					if( $this->_nom->verify( 3 , $f->fecha_inicio, $f->fecha_fin) ) {
						$response['message'] = 'Nomina Administrativa ya existe.';
					} elseif( $this->_nom->fecha_inicio($f->fecha_inicio)->fecha_fin($f->fecha_fin)->proyecto_id(3)->add()) {
						$ultima = $this->_nom->ultimaNomina();
						$empleados = $this->_nom->getEmpleadoProyecto(3);
						foreach ($empleados as $empleado) 
							$this->_pago->nomina_id($ultima[0]['ultima_nomina'])->trabajador_id($empleado)->fecha(date('y-m-d'))->estado(1)->add();
						
						self::makeExcelNominaNew(3, $ultima[0]['ultima_nomina']);
						$response['message'] = 'Nomina Administrativa Resgistrada.';
					}
				break;
				
				case 2:
					
					if ($this->_nom->verify( $f->list_proyecto , $f->fecha_inicio, $f->fecha_fin) ) {
						$response['message'] = 'Nomina Obrera ya existe.';
					} elseif ($this->_nom->fecha_inicio($f->fecha_inicio)->fecha_fin($f->fecha_fin)->proyecto_id($f->list_proyecto)->add()) {
							$ultima = $this->_nom->ultimaNomina();
							$empleados = $this->_nom->getEmpleadoProyecto($f->list_proyecto);//obrera
						foreach ($empleados as $empleado) {
							$this->_pago->nomina_id($ultima[0]['ultima_nomina'])->trabajador_id($empleado['id'])->fecha(date('y-m-d'))->estado(1)->add();
						}
					 	self::makeExcelNominaNew($f->list_proyecto, $ultima[0]['ultima_nomina']);
						$response['message'] = 'Nomina Obrera Resgistrada.';
					}					
				break;
				
				default:
					$response['message'] = 'ah ocurrido un error.';					
				break;
			}			
		}	else {
			$response['message'] = 'Seleccionar un tipo de nomina por favor.';
		} 
		echo json_encode($response);
	}

	public function delete()
	{
		$this->view(false);
		if (isset($_POST['id_delete'])) {
			if($this->_con->id((int) $_POST['id_delete'])->getById() && $this->_con->estado() == 1) {
				if($this->_con->del(false))
					$data['messagge'] = 'Registro desactivado correctamente.';
					$msg['causas'][]  = 'i';
			} else {
				if($this->_con->del(true))
					$data['messagge'] = 'Registro Activado correctamente.';
							$msg['causas'][]  = 'i';
			}
		}
		echo json_encode($data);
	}

	private function _update()
	{
		extract($_POST);
		if(($id > 0)&& $this->_con->id($id)->fecha_elaboracion($fecha_elaboracion)->estado(1)->pro_id($list_proyecto)->add
		())
		$ho['error'] = 'Registro se actualizado correctamente.';
				$this->messagge2=$ho;
	}

	//liquidar totales nomina
	private function liquidarparafiscales($nom) {
		$tot_dev = 0;
		foreach ($this->NominaObj as $key => $emp) {		
			$tot_dev += array_sum( (array) $emp->devengado );
		}	

		$sena = $this->_nom->sena($tot_dev);
		$icbf = $this->_nom->icbf($tot_dev);
		$ccf  = $this->_nom->ccf($tot_dev);
		$this->_par->insertar($nom, $sena, $icbf, $ccf);
	}


	// // test calculo nomina
	// private function liquidarNomina(array $empleados) {
		
	// 	foreach ($empleados as $emp) {
	// 		$nomina['empleado:'.$emp] = (object) array(
	// 							'informacion'=> self::information($emp),
	// 							'dias' => $this->_nom->diasTrabajados($emp),
	// 							'devengado'  => $this->Devengados($emp),
	// 							'apropiacion'=> $this->Apropiaciones($emp),
	// 							'prestaciones_sc'=> $this->Prestaciones_sociales($emp)
	// 					);
	// 	}
	// 	$this->NominaObj = (object) $nomina;
	// }

	// test calculo nomina
	private function liquidarNomina(array $empleados, $finicio, $ffin) {
		
		foreach ($empleados as $emp) {
			$nomina['empleado:'.$emp] = (object) array(
								'informacion'=> self::information($emp),
								'dias' => $this->_nom->diasTrabajados($emp),
								'devengado'  => $this->Devengados($emp, $finicio, $ffin)
						);
		}
		$this->NominaObj = (object) $nomina;
	}

	public function registrarConceptoNomina($pro, $nom) {

		self::liquidarNomina($this->_nom->getEmpleadoProyecto($pro));
		$total = 0;
		$fec_ac = date('Y-m-d');
		foreach ($this->NominaObj as $key => $emp) {

			#>Devengado
				#auxilio trans.
			$this->_nom->insertpago($emp->informacion->id, 1, $emp->devengado->auxilio, $fec_ac, 'devengado:auxilio', 1, $nom); 
				#horas extras
			$this->_nom->insertpago($emp->informacion->id, 8, $emp->devengado->hextras, $fec_ac, 'devengado:liquidacion-extras', 1, $nom); 
				#comision
			$this->_nom->insertpago($emp->informacion->id, 18, $emp->devengado->comision, $fec_ac, 'devengado:comision', 1, $nom); 

			#>Deducciones 
				#salud
			$this->_nom->insertpago($emp->informacion->id, 11, $emp->deducciones->salud, $fec_ac, 'deduccion:salud', 1, $nom); 
				#pension
			$this->_nom->insertpago($emp->informacion->id, 10, $emp->deducciones->pension, $fec_ac, 'deduccion:pension', 1, $nom); 
			
			#>Apropiaciones: seguridad social
				#salud
			$this->_nom->insertpago($emp->informacion->id, 2, $emp->apropiacion->salud, $fec_ac, 'seguridad social:salud', 1, $nom); 
				#pension
			$this->_nom->insertpago($emp->informacion->id, 9, $emp->apropiacion->pension, $fec_ac, 'seguridad social:pension', 1, $nom);
				#arp
			$this->_nom->insertpago($emp->informacion->id, 3, $emp->apropiacion->arp, $fec_ac, 'seguridad social:arp', 1, $nom);  

			#>Apropiaciones: Prestaciones sociales
				#cesantias
			$this->_nom->insertpago($emp->informacion->id, 35, $emp->prestaciones_sc->cesantias, $fec_ac, 'prestacion social:cesantias', 1, $nom);  
				#interes cesantias
			$this->_nom->insertpago($emp->informacion->id, 21, $emp->prestaciones_sc->interes_cesantias, $fec_ac, 'prestacion social:interes cesantia', 1, $nom);  
				#vacaciones
			$this->_nom->insertpago($emp->informacion->id, 34, $emp->prestaciones_sc->vacaciones, $fec_ac, 'prestacion social:vacaciones', 1, $nom);  
				#prima
		}
		############## Parafiscales >>>>>>>>>>>
		$this->liquidarparafiscales($nom);
	}

	public function totalnomina( $pro = 3) {
		$this->view(false);
		//$this->_pago->nomina_id($ultima[0]['ultima_nomina'])->trabajador_id($empleado['id'])->fecha(date('y-m-d'))->estado(1)->add()
		self::liquidarNomina($this->_nom->getEmpleadoProyecto($pro));
		echo '<pre>' . print_r($this->NominaObj, true) . '</pre>';

		$total = 0;
		foreach ($this->NominaObj as $key => $emp) {
			echo $emp->informacion->primer_nombre().': '.$emp->deducciones->salud .'<br>';
			$total += $emp->deducciones->salud;
			echo $total;
			echo '<hr> salud:'. $this->_nom->Salud($emp->informacion->id) .'<br> bla bla:'. number_format($this->_nom->Salud($emp->informacion->id), 0, '.', '') .'<br>';
		}
	}

	private function information($empleado) {
		$emp = $this->setModel('trabajador');
		return $emp->id($empleado)->getById();
	}
   
    /*DEDUCCIONES*/
	private function Deducciones($empleado) {
		return (object) array(
					 'salud'=>  $this->_nom->Salud($empleado),
					 'pension'=>$this->_nom->Pension($empleado));
	}

	/** Devengados */
	private function Devengados($emp, $finicio, $ffin) 
	{
		return (object) array('sueldo'=>  $this->_nom->sueldo($emp),
							  'comision'=>$this->_nom->viewComissionPeriod($emp, $finicio, $ffin),
							  'hextras'=>$this->_nom->tthorasExtras($emp),
							  'auxilio'=>$this->_nom->auxilio($emp));
	}

	/*Apropiaciones*/
	private function Apropiaciones($empleado) 
	{
		return (object) array('arp'=>$this->_nom->Arp($empleado),
					 'salud'=>$this->_nom->Salud_Prest($empleado),
					 'pension'=>$this->_nom->Pension_Prest($empleado),
					 'cesantias'=>$this->_nom->Cesantias($empleado,$f->fecha_inicio, $f->fecha_fin),
					 'interes cesantias'=>$this->_nom->Interes_Cesantias($empleado),
					 'vacaciones'=>$this->_nom->Vacaciones($empleado));
	}

	public function Prestaciones_sociales($empleado) {
		return (object) array('cesantias'=>$this->_nom->Cesantias($empleado),
					 'interes_cesantias'=>$this->_nom->Interes_Cesantias($empleado),
					 'vacaciones'=>$this->_nom->Vacaciones($empleado));
	}

	//test values

	/*Total de horas*/
    public function horas_nocturnas() 
	{
		$this->view(false);
		echo 'horas_nocturnas:' .$this->_nom->totalhoras_nocturnas(16);
		return $this->_nom->totalhoras_nocturnas(16);
	}

	public function horas_diurnas() 
	{
		$this->view(false);
		return $this->_nom->totalhoras_diurnas(16);
	}


	public function horas_diur_dominical() 
	{
		$this->view(false);
		return $this->_nom->totalhoras_diur_dominical(16);
	}

	public function horas_noc_dominical() 
	{
		$this->view(false);
		return $this->_nom->totalhoras_noc_dominical(16);
	}

	public function horas_diur_ext_dominical() 
	{
		$this->view(false);
		return $this->_nom->totalhoras_diur_ext_dominical(16);
	}

	public function horas_noc_ext_dominical() 
	{
		$this->view(false);
		return $this->_nom->totalhoras_noc_ext_dominical(16);
	}



	public function dias_trabajados() 
	{
		$this->view(false);
		print_r($this->_nom->diasTrabajados(16));
	}

	public function tcontrato() 
	{
		$this->view(false);
		print_r($this->_nom->tipoContrato(16));
	}

	public function sueldo() 
	{
		$this->view(false);
		//print_r($this->_nom->sueldo(16));
		return $this->_nom->sueldo(16);
	}

	public function indemnizacion($empleado) {
		$this->view(false);
		//echo 'valor indemnizacion:' .$this->_nom->indemnizacion(16);
		return $this->_nom->indemnizacion($empleado);
	}


	public function totaldevengado($empleado) {
		return $this->_nom->totaldevengado($empleado);
	}
}
